
	Tytulu dodatku:	System delegacji
	Wersja GM: 6
	Autor: Ranmus (email wyslesz za pomoca forum ponizszej strony)
	Witryna: http://www.gamemaker.pl (www.gmclan.org)

	Licencja:
	Z dodatku mozna korzystac dowoli we wszelakiej dzialalnosci.
	Nie mozna:
		- Podpisywac sie pod tym dodatkiem
		- Udostepniac dodatek w wersji zmodyfikowanej bez wiedzy autora
		- Sprzedawac dodatku ;)


	Opis:
	System delegacji dla GM, to system niejawnego wywolywania skryptow i zdarzen obiektow trzecich.
	Wbudowany system wywolywania zdarzen niestety pozwala wywolac tylko jedno zdarzenie na raz.
	Ten dodatek eliminuje ta niedogonosc, a ponadto pozwala na niejawne wiazanie relacji miedzy roznymi obiektami,
	a takze przekazywanie parametrow podczas wywolywania zdarzen oraz pozwala na identyfikacje obiektu wywolujacego.

	Skrypty:

	DelegateCreate()
		Tworzy nowa delegacje (kontener / zasobnik dla zdarzen zwanych delegatami). Zwraca id delegacji.

	DelegateAddScript( id delegacji, id skryptu, id obiektu wlasciciela )
		Do delegacji podanej jako pierwszy argument zostaje dodane nowe zdarzenie (delegat). Jest nim okreslony
		skrypt (argument 2). Skrypt ten bedzie wywolywany przez obiekt podany w argumencie trzecim.
		Zamiast id obiektu mozna dodawac typy obiektow, wtedy takie zdarzenie wiaze ze soba wszystkie obiektu danego typu.
		Funkcja zwraca false gdy danej delegacji nie ma lub unikatowe ID zdarzenia (delegata).

	DelegateAddEvent( id delegacji, numer eventa event_user, id obiektu )
		Procz skryptow mozna rejestrowac takze eventy typu event_user (Game Maker oferuje ich 15).
		Funkcja dziala analogicznie jak poprzednia. Rejestrujemy okreslony event_user obiektu z trzeciego argumentu.

	DelegateSize( id delegacji )
		Zwraca liczbe zdarzen (delegatow) zarejestrowanych w delegacji.

	DelegateCall( id delegacji, argument1, argument2 ... )
		Wywoluje wszystkie zdarzenia (delegaty), ktore sa zarejestrowane w danej delegacji.
		Jesli okreslony delegat to skrypt, zostana mu przekazane wszystkie parametry procz pierwszego (id delegacji)
		Ponadto wywolywane zdarzenie (event_user lub skrypt) moze odwolac sie do 2 zmiennych globalnych:
			global.DL_Sender - id obiektu, ktory wywolal delegacje
			global.DL_Params - tablica parametrow przekazana podczas wywolywania delegacji
		Uwaga! Nie modyfikuj tych zmiennych, traktuj je jako tylko do odczytu, gdyz ustawianie sa one tylko raz
		przed wywolaniem zdarzen danej delegacji. Po ich wywolaniu zmienne te sa resetowane!

	DelegateDelete( ID delegata )
		Funkcja, ktora usuwa delegata o ID, ktora zwrocila wczesniej funkcja DelegateAddEvent / DelegateAddScript
		Nie trzeba podawac ID delegacji, gdyz funkcja jest inteligenta i wie w jakiej delegacji siedzi delegat. :)
		Zwraca false, gdy nie znaleziono delegata o podanym ID

	DelegateDeleteAll( ID obiektu )
		Funkcja usuwa wszystkie zdarzenia (delegaty) ze wszystkich delegacji w systemie,
		ktorych wlascicielem jest obiekt podany w argumencie pierwszym lub typ obiektu.
		Uwaga! Gdy odrejestrujemy okreslony obiekt, to i tak beda mu wywolywane
		zdarzenia, ktore zostaly zarejestrowane ogolnie dla typu obiektu!
		
		Uwaga:
			Funkcja ta przydatna gdy niszczymy obiekt, ktory mial zarejestrowane zdarzenia w jakichs delegacjach,
			gdyz system nie obserwuje czy dany obiekt jeszcze istnieje!

	DelegateClear( ID delegacji )
		Funkcja usuwa z delegacji wszystkie zdarzenia (delegatow).
		Zwraca false gdy nie ma zadanej delegacji.

	DelegateDestroy( ID delegacji )
		Funkcja czysci dana delegacje z delegatow, a nastepnie calkowicie usuwa delegacje,
		ktora zostala utworzona przy pomocy DelegateCreate.
		
		Uwaga:
			Zawsze usuwaj delegacje gdy juz jej nie uzywasz (Game Maker nie ma "Garbage Collectora").

	DelegateDrawDebugger()
		Rysuje prosty debugger calego systemu delegacji. Najwazniejsza jest ostatnia struktura. :P

	Szybki sposob uzycia:
	1) Tworzymy nowa delegacje:
		D = DelegateCreate();

	2) Rejestrujemy zdarzenie event_user_3 oraz skrypt Testowy obiektowi Test.
		DelegateAddEvent(  D, 3, Test );
		DelegateAddScript( D, Testowy, Test );

	3) Wywolujemy delegacje (i powyzsze zdarzenia) razem z 3 testowymi parametrami:
		DelegateCall( D, "a", "b", "c" );

	4) I to wszystko! :D Obiektowi Test zostanie wywolany event_user_3 oraz skrypt Testowy.



	Aby system delegacji dzialal bezkolizyjnie, nie uzywaj ponizszych nazw:
	    global.DL_Initiated, global.DL_EventId, global.DL_EventDelegate, global.DL_ObjectDelegates,
		global.DL_Delegates, global.DL_ID, global.DL_VID, global.DL_Sender, global.DL_Params

	W skryptach sa uzywane zmienne tymczasowe, ktore sa nazywane konwencja:
		_nazwa_zmiennej
	Poprzedzaj zmienne tymczasowe podkreslnikiem. To dobry zwyczaj, ktory powoduje bezkolizyjnosc skryptow.


	Milego uzytkowania! :)
